package com.netease.dragonwar.sprite;
/** 
* @author  louxj424
* @date 创建时间：2018年3月4日 下午8:23:41 
* @version 0.1.0  
* @since jdk 1.7.0
 */

import java.awt.image.BufferedImage;

import com.netease.dragonwar.common.Constant;
import com.netease.dragonwar.common.GameDirectionEnum;
import com.netease.dragonwar.util.ImageUtils;

public class Hero extends Sprite {

	/**
	 * 自己创建一个对象
	 */
	private static Hero hero=null;

	/**
	 * 英雄移动的方向
	 */
	private GameDirectionEnum direction;

	/**
	 * 英雄在X轴的偏移量
	 */
	private int offsetX;

	/**
	 * 英雄在Y轴的偏移量
	 */
	private int offsetY;

	/**
	 * 英雄四个方向图片的二维数组
	 */
	private BufferedImage[][] imgs = ImageUtils.getHeroImages();

	/**
	 * 当前英雄在数组中的额索引
	 */
	private int imgIndex = 0;

	/**
	 * 私有化构造函数
	 * @param x
	 * @param y
	 * @param width
	 * @param height
	 * @param speed
	 * @param direction
	 */
	private Hero(int x, int y, int width, int height, int speed, GameDirectionEnum direction) {
		super(x, y, width, height, speed);
		this.direction = direction;
	}
	
	public static Hero getInstance() {
		if (hero==null) {
			hero=new Hero(Constant.WINDOW_WIDTH/2, Constant.WINDOW_HEIGHT/2, 32, 48, 5, GameDirectionEnum.DIRECTION_RIGHT);
		}else{
			hero.setX(Constant.WINDOW_WIDTH/2);
			hero.setY(Constant.WINDOW_HEIGHT/2);
			hero.setSpeed(5);
			hero.setDirection(GameDirectionEnum.DIRECTION_RIGHT);
		}
		return hero;
	}
	
	@Deprecated
	public void resetHero(){
		if (hero!=null) {
			this.setX(Constant.WINDOW_WIDTH/2);
			this.setY(Constant.WINDOW_HEIGHT/2);
			this.setSpeed(5);
			this.setDirection(GameDirectionEnum.DIRECTION_RIGHT);
		}		
	}

	public void setDirection(GameDirectionEnum direction) {
		this.direction = direction;
	}

	@Override
	public BufferedImage getImage() {
		return imgs[direction.getCode()][imgIndex];
	}

	public int getOffsetX() {
		return offsetX;
	}

	public void setOffsetX(int offsetX) {
		this.offsetX = offsetX;
	}

	public int getOffsetY() {
		return offsetY;
	}

	public void setOffsetY(int offsetY) {
		this.offsetY = offsetY;
	}

	/**
	 * 英雄摆动的方法
	 */
	public void flicker() {
		// 将英雄图片的索引改为数组中的下一个索引
		imgIndex = ++imgIndex % imgs[direction.getCode()].length;
	}

	/**
	 * 英雄移动的方法
	 */
	@Override
	public void move() {
		//对偏移后的位置有效性进行判断，防止英雄移出窗口
		int x=getX() + offsetX;
		int y=getY() + offsetY;
		if (x<0) {
			x=0;
		}else if (x>Constant.WINDOW_WIDTH) {
			x=Constant.WINDOW_WIDTH;
		}
		if (y<0) {
			x=0;
		}else if (y>Constant.WINDOW_HEIGHT) {
			y=Constant.WINDOW_HEIGHT;
		}
		
		setX(x);
		setY(y);
	}

	/**
	 * 英雄射击的方法
	 * @return
	 */
	public Bullet shoot() {
		// 定义子弹中心点坐标
		int bulletX = 0;
		int bulletY = 0;

		// 根据当前英雄方向计算子弹中心点坐标
		switch (direction) {
		case DIRECTION_UP:
			bulletX = getX();
			bulletY = getY() - getHeight() / 2;
			break;
		case DIRECTION_RIGHT:
			bulletX = getX() + getWidth();
			bulletY = getY();
			break;
		case DIRECTION_DOWN:
			bulletX = getX();
			bulletY = getY() + getHeight() / 2;
			break;
		case DIRECTION_LEFT:
			bulletX = getX() - getWidth() / 2;
			bulletY = getY();
			break;
		}

		return new Bullet(bulletX, bulletY, 27, 27, 25, direction);
	}

}
